package com.maven.trans.demos.controller;


import com.maven.trans.demos.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@Slf4j
@RequestMapping("/trans")
@RestController
public class TransController {
    @Autowired
    UserService userService;

    // 这里我们直接采用 注解的方式 实现 事务
    @Transactional
    @RequestMapping("/r1")
    public String r1(String userName, String password) {

        Integer result = userService.register(userName, password);
        log.info("注册成功，影响行数：" + result);

        return "success";
    }  // 如果没有异常，就会直接进行提交


    @Transactional
    @RequestMapping("/r2")
    public String r2(String userName, String password) {

        Integer result = userService.register(userName, password);
        log.info("注册成功，影响行数：" + result);
        int a = 10 / 0;
        return "success";
    }  // 这里是 运行时异常，会 进行  事务回滚

    // 如果出现异常，我们不想回滚：我们可以try catch
    @Transactional
    @RequestMapping("/r21")
    public String r21(String userName, String password) {

        Integer result = userService.register(userName, password);
        log.info("注册成功，影响行数：" + result);
        try{
            int a = 10 / 0;
        }catch (Exception e){
            log.info("发生异常");
        }

        return "success";
    }  // 这里是 运行时异常，会 进行  事务回滚


    @Transactional
    @RequestMapping("/r3")
    public String r3(String userName, String password) throws IOException {

        Integer result = userService.register(userName, password);
        log.info("注册成功，影响行数：" + result);

        try {
            int a = 10 / 0;
        } catch (Exception e) {
            throw new IOException();
        }
        return "success";
    }  //  我们这里 尝试 如果 抛出的是  其他类型的异常会不会进行回滚， 结果是不会 ；前提是 运行时异常和error
    // 那如果我们要回滚呢 ， 我们就得进行调节：@Transactional(rollbackFor = Exception.class)

    @Transactional
    @RequestMapping("/r4")
    public String r4(String userName, String password) throws IOException {

        Integer result = userService.register(userName, password);
        log.info("注册成功，影响行数：" + result);

        try {
            int a = 10 / 0;
        } catch (Exception e) {
//(1)          throw  e;
//(2)
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return "success";
    } // 如果发生异常 ，我不想执行 事务提交怎么办： (1) 抛出异常   (2) 手动进行事务 回滚操作



    // 事务的隔离级别                                                引发的问题：
/*    @Transactional(isolation = Isolation.DEFAULT)
    @Transactional(isolation = Isolation.READ_UNCOMMITTED)        脏读（读到未提交的数据）
    @Transactional(isolation = Isolation.READ_COMMITTED)          不可重复读
    @Transactional(isolation = Isolation.REPEATABLE_READ)         幻读
    @Transactional(isolation = Isolation.SERIALIZABLE)
    */
}
